package net.lulihu.pangolin.headless.common.protocol;

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.Arrays;
import java.util.List;

/**
 * 数据交互协议消息
 */
@Setter
@Getter
@NoArgsConstructor
public class ProtocolMessage {

    /**
     * 消息类型
     * {@linkplain ProtocolMessageType}
     */
    private byte type;

    /**
     * 消息主体
     */
    private byte[] body;

    /**
     * 设置对象主体
     *
     * @param obj 对象
     */
    public void setBodyObj(Object obj) {
        setBodyStr(JSON.toJSONString(obj));
    }

    /**
     * 设置字符串主体
     *
     * @param str 字符串
     */
    public void setBodyStr(String str) {
        setBody(str.getBytes());
    }

    /**
     * 将主体消息反序列化为对象
     *
     * @param beanClass 对象类型
     * @param <T>       泛型
     * @return 对象
     */
    public <T> T getBodyObj(Class<T> beanClass) {
        String bodyStr = getBodyStr();
        return JSON.parseObject(bodyStr, beanClass);
    }

    /**
     * 将主体消息反序列化为集合对象
     *
     * @param beanClass 对象类型
     * @param <T>       泛型
     * @return 对象
     */
    public <T> List<T> getBodyList(Class<T> beanClass) {
        String bodyStr = getBodyStr();
        return JSON.parseArray(bodyStr, beanClass);
    }

    /**
     * 获取主体的字符串类型
     */
    public String getBodyStr() {
        return new String(body);
    }

    @Override
    public String toString() {
        return "ProtocolMessage{" +
                "type=" + type +
                ", body=" + Arrays.toString(body) +
                '}';
    }
}
